package singleton;

/**
 * 双重校验
 * 饿汉式不能懒加载,懒汉式性能不行,不支持高并发.那么我们来看一下支持高并发,支持延迟加载,的方法;
 * 1.声明变量要用volatile关键字,有两个作用;
 * a.保证变量可见性: 当也给被volatile关键字修饰的变量被一个线程修改的时候,其他线程可以立刻得到修改后的结果;
 * b.屏蔽指令重排序: 指令重排序是编译器和处理器为了高效对程序优化的一种手段,它能保证结果正确,但是 无法保证程序操作顺序和执行顺序.单线程中没有问题,但是在多线程中就会有问题;
 * 2.将同步方法改为同步代码块.在同步代码块中使用二次检查,以保证其不会被重复实例化,同时在调用getIntance()方法的时候不进行同步锁,效率高;
 * @author 1
 * @version 1.0
 * @description: TODO
 * @date 2024-08-23 16:06
 */
public class Singleton_04 {
    /**
     * 1.使用volatile 关键字修饰成员变量,保证变量可见性
     */
    private volatile static  Singleton_04 instance;

    /**
     * 2.私有构造
     */
    private Singleton_04(){};

    /**
     * 3.对外提供获取对象的方法
     * @return
     */
    public static Singleton_04 getInstance() {
        //第一次判断instance不为null的时候,不进入抢锁,直接返回对象
        if (instance == null) {
            //如果null就加锁
            synchronized (Singleton_04.class) {
                //抢到锁之后先判断是否为null
                if (instance == null) {
                    instance = new Singleton_04();
                }
            }
        }
        return instance;
    }





}
